package hashBuck;

// 哈希桶的测试

import java.util.HashMap;
import java.util.Objects;

// 给一个类，key是引用类型
class Person {
    public String id;

    public Person(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "id=" + id ;
    }

    // 重写hashCode和equals方法：
    // 此时相同id会生成相同哈希值
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(id, person.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

public class Test {

    // 进行key是引用类型的测试
    public static void main(String[] args) {
        //HashMap<Person,String> map = new HashMap<>(); // 此时Person引用类型就是key，不能进行整数加减计算index

        // so：
        Person person1 = new Person("98765");
        Person person2 = new Person("98765");
        HashBuck2<Person,String> hashBuck2 = new HashBuck2<>();
        hashBuck2.put(person1,"Xianmeng");
        //hashBuck2.put(person2,"Kun");
        System.out.println(hashBuck2.get(person2));
        // 注意此时两个person的id一样，说明是同一个人，此时虽然只是put1，但是获取2也是会得与1一样的val


        /*// 因为该类中没有实现hashCode方法，所以调用父类中的hashCode方法
        // 返回对象的哈希值
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
        // 此时就可以根据哈希值去找数组中的下标位置！！

        // 但是注意：理论上身份证号一样就是同一个人，应该具有相同的哈希值，但是实际输出是不同的哈希值
        // 所以在类中重写hashCode方法*/
    }


    public static void main1(String[] args) {
        HashBuck hashBuck = new HashBuck();
        // 添加存储节点
        hashBuck.put(1,11);
        hashBuck.put(2,22);
        hashBuck.put(3,33);
        hashBuck.put(14,44);
        hashBuck.put(5,55);
        System.out.println("======");
        System.out.println(hashBuck.get(3)); // 通过key获取val
    }
}
